home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / games / 111 / fortune.c < prev    next >
C/C++ Source or Header  |  1987-02-19  |  2KB  |  83 lines

  1. /* fortune.c         Larn is copyrighted 1986 by Noah Morgan. */
  2. #ifdef TOS
  3. #include <fcntl.h>
  4. #include <astat.h>
  5. #else
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8.  
  9. #ifndef BSD4.1
  10. #include <fcntl.h>
  11. #else BSD4.1
  12. #define O_RDONLY 0
  13. #endif BSD4.1
  14. #endif
  15.  
  16. #include "header.h"
  17. /*
  18.  *    function to return a random fortune from the fortune file
  19.  */
  20. static char *base=0;    /* pointer to the fortune text */
  21. static char **flines=0;    /* array of pointers to each fortune */
  22. static int fd=0;        /* true if we have load the fortune info */
  23. static int nlines=0;    /* # lines in fortune database */
  24.  
  25. char *fortune(file)
  26.     char *file;
  27.     {
  28.     register char *p;
  29.     register int lines,tmp;
  30.     struct stat stat;
  31.     char *malloc();
  32.     if (fd==0)
  33.         {
  34. #ifdef TOS
  35.         if ((fd=open(file,O_RAW|O_RDONLY)) < 0)    /* open the file */
  36. #else
  37.         if ((fd=open(file,O_RDONLY)) < 0)    /* open the file */
  38. #endif
  39.             return(0); /* can't find file */
  40.  
  41.     /* find out how big fortune file is and get memory for it */
  42.         stat.st_size = 16384;
  43. #ifdef TOS
  44.         if ((getstat(file,&stat) < 0) || 
  45.             ((base=malloc(1+stat.st_size)) == 0))
  46. #else
  47.         if ((fstat(fd,&stat) < 0) || ((base=malloc(1+stat.st_size)) == 0))
  48. #endif
  49.             {
  50.             close(fd); fd= -1; free((char*)base); return(0);     /* can't stat file */
  51.             }
  52.  
  53.     /* read in the entire fortune file */
  54.         if (read(fd,base,stat.st_size) != stat.st_size)
  55.             {
  56.             close(fd); fd= -1; free((char*)base); return(0);     /* can't read file */
  57.             }
  58.         close(fd);  base[stat.st_size]=0;    /* final NULL termination */
  59.  
  60.     /* count up all the lines (and NULL terminate) to know memory needs */
  61.         for (p=base,lines=0; p<base+stat.st_size; p++) /* count lines */
  62.             if (*p == '\n') *p=0,lines++;
  63.         nlines = lines;
  64.  
  65.     /* get memory for array of pointers to each fortune */
  66.         if ((flines=(char**)malloc(nlines*sizeof(char*))) == 0)
  67.             {
  68.             free((char*)base); fd= -1; return(0); /* malloc() failure */
  69.             }
  70.  
  71.     /* now assign each pointer to a line */
  72.         for (p=base,tmp=0; tmp<nlines; tmp++)
  73.             {
  74.             flines[tmp]=p;  while (*p++); /* advance to next line */
  75.             }
  76.         }
  77.  
  78.     if (fd > 2)    /* if we have a database to look at */
  79.         return(flines[rund((nlines<=0)?1:nlines)]);
  80.     else 
  81.         return(0);
  82.     }
  83.